package cn.itcast.up.up_web.controller;

import cn.itcast.up.common.HdfsTools;
import cn.itcast.up.up_web.bean.HttpResult;
import cn.itcast.up.up_web.bean.dto.ModelDto;
import cn.itcast.up.up_web.bean.dto.TagDto;
import cn.itcast.up.up_web.bean.dto.TagModel;
import cn.itcast.up.up_web.service.TagService;
import cn.itcast.up.up_web.utils.Codes;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

/**
 * 标签的控制层,负责和前端交互
 */
@RestController
public class TagController {

    @Autowired
    private TagService tagService;

    // 查询1/2/3级标签
    @GetMapping("tags") //限制请求方式为get
    public HttpResult<List<TagDto>> findTags(Long pid) {
        // 去调用service,开始获取数据.
        List<TagDto> tagsByPid = tagService.findTagsByPid(pid);
        // 如果出现错误,返回一个状态信息
        // 404 界面找不到了
        // 500 后台出错啦...
        return new HttpResult<List<TagDto>>(Codes.SUCCESS, "查询成功", tagsByPid);
    }

    // 保存123级标签数据
    @PutMapping("tags/relation") //限制请求方式为put
    public HttpResult<List<TagDto>> saveTags(@RequestBody List<TagDto> list) {
        System.out.println(list);
        // 将标签存入数据库
        tagService.saveTags(list);
        return new HttpResult<List<TagDto>>(Codes.SUCCESS, "查询成功", null);
    }

    // 保存4级标签数据
    @PutMapping("tags/model") //限制请求方式为put
    public HttpResult<List<TagDto>> saveTagModel(@RequestBody TagModel tagModel) {
        System.out.println(tagModel);
        tagService.saveTagModel(tagModel);
        return new HttpResult<List<TagDto>>(Codes.SUCCESS, "查询成功", null);
    }

    // 保存4级标签数据
    @GetMapping("tags/model") //限制请求方式为get
    public HttpResult<List<TagModel>> getTagModel(Long pid) {
        List<TagModel> list = tagService.findTagModel(pid);
        return new HttpResult<List<TagModel>>(Codes.SUCCESS, "查询成功", list);
    }

    // 保存5级标签数据
    @PutMapping("tags/data") //限制请求方式为put
    public HttpResult<List<TagModel>> addDataTag(@RequestBody TagDto dto) {
        tagService.saveTag(dto);
        return new HttpResult<List<TagModel>>(Codes.SUCCESS, "查询成功", null);
    }

    /**
     * 文件上传
     * MultipartFile file : MultipartFile指定参数是一个文件类型  file: 前端在进行上传的时候表单中的变量名.
     */

    @PostMapping("tags/upload") //限制请求方式为post
    public HttpResult<String> addDataTag(MultipartFile file) throws Exception {
        // 接收文件
        String contentType = file.getContentType();// 文件的类型
        String originalFilename = file.getOriginalFilename();//文件名称
        long size = file.getSize();//文件大小
        System.out.println("contentType: " + contentType);
        System.out.println("originalFilename: " + originalFilename);
        System.out.println("size: " + size);
        InputStream inputStream = file.getInputStream();// 文件的输入流
        // 将文件缓存到本地
        IOUtils.copy(inputStream, new FileOutputStream("a.jar"));
        // 构建一个上传的路径. 路径不要写死
        String fileName = UUID.randomUUID().toString() + ".jar";
        String hdfsPath = "/tmp/jars/" + fileName;
        // 将本地文件上传到HDFS
        // 开始上传
        HdfsTools.build().uploadLocalFile2HDFS("a.jar", hdfsPath);
        // 将HDFS的文件路径返回给前端
        return new HttpResult<String>(Codes.SUCCESS, "上传成功", "hdfs://bd001:8020" + hdfsPath);
    }

    @PostMapping("tags/{id}/model")
    public HttpResult changeModelState(@PathVariable Long id, @RequestBody ModelDto modelDto) {
        tagService.updateModelState(id, modelDto.getState());
        return new HttpResult(Codes.SUCCESS, "执行成功", null);
    }

}
